﻿using PortalBusiness.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;

namespace PortalBusiness.Controllers
{
    [Authorize]
    public class CAIXAController : Controller
    {
        private PortalBusinessContext db = new PortalBusinessContext();

        // GET: CAIXA
        public ActionResult Index()
        {
            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();
            List<CAIXA> caixas = db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA && c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO)
                .OrderBy(c => c.STATUS).ThenBy(p => p.CAIXAID*(-1)).ToList();

            ViewBag.COLUNAS = db.COLUNAs.Where(c => c.ATIVO == true).ToList();
            ViewBag.MostrarIncluir = false;
            if (db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                c.STATUS == 0
                ).Count() == 0)
                ViewBag.MostrarIncluir = true;


            return View(caixas);
        }

        public ActionResult Incluir()
        {
            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();

            if (db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                c.STATUS == 0
                ).Count() > 0)
                return RedirectToAction("Index");
            
            ViewBag.COLUNAS = db.COLUNAs.Where(c => c.ATIVO == true).ToList();
            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Não", Value = "0" });
            tipo.Add(new SelectListItem() { Text = "Sim", Value = "1" });
            ViewBag.STATUS = tipo;
            CAIXA caixa = new CAIXA();
            caixa.VALORES = new List<Double>();
            caixa.ID_COLUNAS = new List<int>();
            caixa.CAIXA_SANGRIA = 0;
            foreach (COLUNA item in db.COLUNAs.Where(c => c.ATIVO == true).ToList())
            {
                caixa.VALORES.Add(0);
                caixa.ID_COLUNAS.Add(item.COLUNAID);
            }
            caixa.CAIXA_TOTAL = 0;
            return View(caixa);
        }

        [HttpPost]
        public ActionResult Incluir(CAIXA caixa)
        {

            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();

            if (caixa.ID_COLUNAS == null)
            {
                ModelState.AddModelError("", "Id Colunas");
                caixa.ID_COLUNAS = new List<int>();
            }

            if (caixa.VALORES == null)
            {
                ModelState.AddModelError("", "Id Colunas");
                caixa.VALORES = new List<double>();
            }


            if (db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                    c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO).Max(m => (DateTime?) m.DATA) > caixa.DATA.Date.AddDays(
                Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["QtdeDiasCaixa"])))
                ModelState.AddModelError("DATA", "Data fora do periodo permitido!");

            if (caixa.ID_COLUNAS.Count() != caixa.VALORES.Count())
                ModelState.AddModelError("", "Quantidade de valores errados");

            if (!ModelState.IsValid)
            {
                ViewBag.COLUNAS = db.COLUNAs.Where(c => c.ATIVO == true).ToList();
                List<SelectListItem> tipo = new List<SelectListItem>();
                tipo.Add(new SelectListItem() { Text = "Não", Value = "0" });
                tipo.Add(new SelectListItem() { Text = "Sim", Value = "1" });
                ViewBag.STATUS = tipo;
                foreach (COLUNA item in db.COLUNAs.Where(c => c.ATIVO == true).ToList())
                {
                    caixa.VALORES.Add(0);
                    caixa.ID_COLUNAS.Add(item.COLUNAID);
                }
                return View(caixa);
            }

            caixa.COLUNAS = new List<CAIXA_COLUNA>();
            caixa.DATA_PROCESSAMENTO = DateTime.Today;
            caixa.HORA_PROCESSAMENTO = DateTime.Now.ToString("HH:mm:ss");
            caixa.CAIXA_TOTAL = 0;

            int cont = 0;
            foreach (int item in caixa.ID_COLUNAS)
            {
                COLUNA col = db.COLUNAs.Find(item);
                caixa.COLUNAS.Add(new CAIXA_COLUNA()
                {
                    CODIGO = col.CODIGO,
                    COLUNAID = col.COLUNAID,
                    NOME = col.NOME,
                    VALOR = caixa.VALORES[cont]
                });
                caixa.CAIXA_TOTAL += caixa.VALORES[cont];
                cont++;
            }
            caixa.LOGIN = usuario.LOGIN;
            caixa.CODIGO_LOJA = usuario.CODIGO_LOJA;
            caixa.CODIGO_NEGOCIO = usuario.CODIGO_NEGOCIO;

            List<TITULO> sangrias = db.TITULOes.Where(t => t.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                t.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                t.DOC_TIPO == 1 &&
                t.STATUS == 0 &&
                t.DOC_EMISSAO == caixa.DATA).ToList();

            caixa.CAIXA_SANGRIA = 0;

            foreach (TITULO item in sangrias)
            {
                caixa.CAIXA_SANGRIA += item.DOC_VALOR;
                if (caixa.STATUS == 1)
                {
                    item.STATUS = 1;
                    db.Entry(item).State = EntityState.Modified;
                }
            }


            caixa.CAIXA_TOTAL += caixa.CAIXA_SANGRIA;
            caixa.CAIXA_QUEBRA = caixa.CAIXA_TOTAL - caixa.CAIXA_FITA;

            db.CAIXAs.Add(caixa);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        [HttpPost]
        public ActionResult GetSangria(DateTime Data)
        {
            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();
            Double sangria = db.TITULOes.Where(t => t.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                t.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                t.DOC_TIPO == 1 &&
                t.STATUS == 0 &&
                t.DOC_EMISSAO == Data).Sum(t => (Double?) t.DOC_VALOR ) ? 0;
            return Json(sangria, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Edit(int Id)
        {
            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();
            CAIXA caixa = db.CAIXAs.Find(Id);
            if (caixa.STATUS != 0 || 
                caixa.CODIGO_LOJA != usuario.CODIGO_LOJA || 
                caixa.CODIGO_NEGOCIO != usuario.CODIGO_NEGOCIO
                ) 
                return RedirectToAction("Index");

            ViewBag.COLUNAS = db.COLUNAs.Where(c => c.ATIVO == true).ToList();
            List<SelectListItem> tipo = new List<SelectListItem>();
            tipo.Add(new SelectListItem() { Text = "Não", Value = "0" });
            tipo.Add(new SelectListItem() { Text = "Sim", Value = "1" });
            ViewBag.STATUS = tipo;

            caixa.VALORES = new List<Double>();
            caixa.ID_COLUNAS = new List<int>();

            foreach (CAIXA_COLUNA item in caixa.COLUNAS)
            {
                caixa.VALORES.Add(item.VALOR);
                caixa.ID_COLUNAS.Add(item.COLUNAID);
            }
            return View(caixa);
        }
        [HttpPost]
        public ActionResult Edit(CAIXA obj)
        {
            CAIXA caixa = db.CAIXAs.Find(obj.CAIXAID);

            caixa.CAIXA_FITA = obj.CAIXA_FITA;
            caixa.CAIXA_OBSERVACAO = obj.CAIXA_OBSERVACAO;
            caixa.STATUS = obj.STATUS;
            obj.DATA = caixa.DATA;

            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();

            caixa.DATA_PROCESSAMENTO = DateTime.Today;
            caixa.HORA_PROCESSAMENTO = DateTime.Now.ToString("HH:mm:ss");
            caixa.CAIXA_TOTAL = 0;
            if (caixa == null)
                    caixa.COLUNAS = new List<CAIXA_COLUNA>();

            int cont = 0;
            foreach (CAIXA_COLUNA item in caixa.COLUNAS)
            {
                item.VALOR = obj.VALORES[cont];
                caixa.CAIXA_TOTAL += obj.VALORES[cont];
                cont++;
            }

            caixa.LOGIN = usuario.LOGIN;
            List<TITULO> sangrias = db.TITULOes.Where(t => t.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                t.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                t.DOC_TIPO == 1 &&
                t.STATUS == 0 &&
                t.DOC_EMISSAO == caixa.DATA).ToList();

            caixa.CAIXA_SANGRIA = 0;

            foreach (TITULO item in sangrias)
            {
                caixa.CAIXA_SANGRIA += item.DOC_VALOR;
                if (caixa.STATUS == 1)
                {
                    item.STATUS = 1;
                    db.Entry(item).State = EntityState.Modified;
                }
            }

            caixa.CAIXA_TOTAL += caixa.CAIXA_SANGRIA;
            caixa.CAIXA_QUEBRA = caixa.CAIXA_TOTAL - caixa.CAIXA_FITA;

            db.Entry(caixa).State = EntityState.Modified;
            db.SaveChanges();

            return RedirectToAction("Index");
        }
        public ActionResult Excluir(int id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            CAIXA caixa = db.CAIXAs.Find(id);
            if (caixa == null || caixa.LOGIN != User.Identity.Name  || caixa.STATUS != 0)
            {
                return HttpNotFound();
            }
            return View(caixa);
        }
        [HttpPost]
        public ActionResult Excluir(CAIXA caixax)
        {
            CAIXA caixa = db.CAIXAs.Find(caixax.CAIXAID);
            db.CAIXAs.Remove(caixa);
            db.SaveChanges();
            return RedirectToAction("Index");
        }


        [HttpPost]
        public ActionResult Salvar(CAIXA_SALVA obj)
        {
            if (obj.DATA == null)
                return Json("DATA INVÁLIDA", JsonRequestBehavior.AllowGet);

            USUARIO usuario = db.USUARIOs.Where(u => u.LOGIN == User.Identity.Name).FirstOrDefault();

            if (db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA && c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO && c.STATUS != 0).Count() > 0
                && db.CAIXAs.Where(c => c.CODIGO_LOJA == usuario.CODIGO_LOJA && c.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO && c.STATUS != 0).Max(m => m.DATA) > obj.DATA.Value.AddDays(
                Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["QtdeDiasCaixa"])))
                return Json("DATA INVÁLIDA", JsonRequestBehavior.AllowGet);

            CAIXA caixa;
            if (obj.CAIXAID == 0)
            {
                caixa = new CAIXA() { LOGIN = usuario.LOGIN, CODIGO_LOJA = usuario.CODIGO_LOJA, CODIGO_NEGOCIO = usuario.CODIGO_NEGOCIO };
                caixa.COLUNAS = new List<CAIXA_COLUNA>();
            }
            else
            {
                caixa = db.CAIXAs.Find(obj.CAIXAID);
                if (caixa.LOGIN != usuario.LOGIN || caixa.STATUS != 0)
                    return Json("SEM PERMISSAO", JsonRequestBehavior.AllowGet);
            }
            caixa.DATA_PROCESSAMENTO = DateTime.Today;
            caixa.HORA_PROCESSAMENTO = DateTime.Now.ToString("HH:mm:ss");
            caixa.DATA = obj.DATA.Value;
            caixa.CAIXA_OBSERVACAO = obj.CAIXA_OBSERVACAO;
            caixa.CAIXA_TOTAL = 0;
            caixa.CAIXA_FITA = obj.CAIXA_FITA;
            caixa.CAIXA_SANGRIA = 0;


            caixa.STATUS = obj.CAIXA_STATUS;

            //db.CAIXA_COLUNAs.RemoveRange(db.CAIXA_COLUNAs.Where(c => c.CAIXAID == caixa.CAIXAID));
            //caixa.COLUNAS.RemoveRange(0, caixa.COLUNAS.Count);

            int cont = 0;
            foreach (int item in obj.COLUNAS)
            {
                COLUNA col = db.COLUNAs.Find(item);
                //db.CAIXA_COLUNAs.Add(new CAIXA_COLUNA()
                if (caixa.COLUNAS.Where(c => c.COLUNAID == col.COLUNAID).Count() == 1)
                    caixa.COLUNAS.Where(c => c.COLUNAID == col.COLUNAID).FirstOrDefault().VALOR = obj.VALORES[cont];
                else
                    caixa.COLUNAS.Add(new CAIXA_COLUNA()
                    {
                        COLUNAID = col.COLUNAID,
                        CODIGO = col.CODIGO,
                        NOME = col.NOME,
                        VALOR = obj.VALORES[cont]
                    });
                caixa.CAIXA_TOTAL += obj.VALORES[cont];
                cont++;
            }

            List<TITULO> sangrias = db.TITULOes.Where(t => t.CODIGO_LOJA == usuario.CODIGO_LOJA &&
                t.CODIGO_NEGOCIO == usuario.CODIGO_NEGOCIO &&
                t.DOC_TIPO == 1 &&
                t.STATUS == 0).ToList();

            foreach (TITULO item in sangrias)
            {
                caixa.CAIXA_SANGRIA += item.DOC_VALOR;
                if (caixa.STATUS == 1)
                {
                    item.STATUS = 1;
                    db.Entry(item).State = EntityState.Modified;
                }
            }
            caixa.CAIXA_TOTAL += caixa.CAIXA_SANGRIA;
            caixa.CAIXA_QUEBRA = caixa.CAIXA_TOTAL - caixa.CAIXA_FITA;

            if (caixa.CAIXAID == 0)
                db.CAIXAs.Add(caixa);
            else
                db.Entry(caixa).State = EntityState.Modified;

            db.SaveChanges();
            return Json("OK", JsonRequestBehavior.AllowGet);
        }

    }
}
